/**
 * Title: LoginService.java
 * Description: Copyright: Copyright (c) 2019 Company: BHFAE
 *
 * @author Sharp
 * @date 2019-7-26 17:56
 * @description Project Name: Grote
 * @Package: com.sharp.authorization.service.common
 */
package com.sharp.authorization.service.login;

import com.sharp.authorization.dao.common.entity.AcUser;
import com.sharp.authorization.vo.login.LoginRes;
import com.sharp.authorization.vo.login.QrCodeReq;
import com.sharp.authorization.vo.login.SsoLoginReq;
import com.sharp.authorization.vo.platform.OpenPlatformAccessTokenResp;
import com.sharp.authorization.vo.platform.OpenPlatformRegResp;

public interface LoginService {

    /**
     * 用户名密码登录.
     *
     * @param loginId       用户标识(用户名或者手机号或者邮箱)
     * @param password 密码
     * @return 登录返回信息
     */
    LoginRes login(String loginId, String password);

    /**
     * 短信验证码登录.
     *
     * @param phoneNumber 手机号码
     * @return 登录返回信息
     */
    LoginRes loginOrReg(String phoneNumber);

    /**
     * 微信小程序登录.
     *
     * @param wechatOpenId 微信openId
     * @return 登录返回信息
     */
    LoginRes loginOrRegByWechatMiniOpenId(String wechatOpenId);

    /**
     * 微信登录.
     *
     * @param wechatUnionId 微信UnionId
     * @param nickName      微信昵称
     * @return 登录返回信息
     */
    LoginRes loginOrRegByWechatUnionId(String wechatUnionId, String nickName);

    /**
     * @param wechatId    微信id
     * @param nickName    微信您呈
     * @param phoneNumber 手机号码
     * @return 登录返回信息
     */
    LoginRes loginOrRegByWechatPhoneNumber(String wechatId, String nickName, String phoneNumber);


    /**
     * refreshToken登录.
     *
     * @param refreshToken 手机号码
     * @return 登录返回信息
     */
    LoginRes refreshLogin(String refreshToken);

    /**
     * 用户名密码注册.
     *
     * @param userId   用户名
     * @param password 密码
     * @return 登录返回信息
     */
    LoginRes register(String userId, String password);

    /**
     * 用户名密码邮箱注册.
     *
     * @param userId   用户名
     * @param password 密码
     * @param email    邮箱
     * @return 登录返回信息
     */
    LoginRes register(String userId, String password, String email);

    /**
     * 创建新用户
     *
     * @param phoneNumber
     * @param name
     * @return
     */
    AcUser createUserWithName(String phoneNumber, String name);

    /**
     * 创建新用户
     *
     * @param userId   用户名
     * @param password 密码
     * @return
     */
    AcUser createUser(String userId, String password);

    /**
     * @param userId      用户id
     * @param password    密码
     * @param name        用户名
     * @param phoneNumber 手机号
     * @param email       邮箱
     * @param avatar      头像
     * @return
     */
    AcUser createUser(String userId, String password, String name, String phoneNumber, String email, String avatar);

    /**
     * 修改账户状态
     *
     * @param userId 用户id
     * @param status 状态
     */
    void changeAccountStatus(String userId, String status);

    /**
     * 绑定用户角色
     *
     * @param loginId 用户id
     * @param roleId  角色id
     */
    void bindRoleByLoginId(String loginId, String roleId);

    /**
     * 绑定用户角色
     *
     * @param userId 用户id
     * @param roleId 角色id
     */
    void bindRole(String userId, String roleId);

    /**
     * 接入开放平台注册.
     *
     * @param name 合作方名称
     * @return 开放平台信息
     */
    OpenPlatformRegResp registerOpenPlatform(String name);


    /**
     * 获取新的appSecret
     *
     * @param appKey
     * @return
     */
    OpenPlatformRegResp getOpenPlatformAppSecret(String appKey);

    /**
     * 开放平台获取accessToken
     *
     * @param appKey
     * @param appSecret
     * @return
     */
    OpenPlatformAccessTokenResp getOpenPlatformAccessToken(String appKey, String appSecret);

    /**
     * 超管账户假借用户登录
     *
     * @param loginId
     * @return
     */
    LoginRes ghostLogin(String loginId);

    /**
     * 超管账户假借用户登录
     *
     * @param qrCodeReq 其他端登录信息
     * @return
     */
    LoginRes loginByQrCode(QrCodeReq qrCodeReq);

    /**
     * 利用邮箱注册账户
     *
     * @param id
     * @param email
     */
    void emailRegister(String id, String email);

    /**
     * 将微信用户合并至已有手机号账户
     *
     * @param unionId
     * @param nickName
     * @param phoneNumber
     */
    void mergeWechatPhoneNumber(String unionId, String nickName, String phoneNumber);

    /**
     * 三方登录系统
     *
     * @param ssoLoginReq
     * @return
     */
    LoginRes ssoLoginOrReg(SsoLoginReq ssoLoginReq);
}
